﻿///////////////////////////////////////////////////////////////////////////////////////////////////////
// Copyright (c) 2023, ООО 1С-Софт
// Все права защищены. Эта программа и сопроводительные материалы предоставляются 
// в соответствии с условиями лицензии Attribution 4.0 International (CC BY 4.0)
// Текст лицензии доступен по ссылке:
// https://creativecommons.org/licenses/by/4.0/legalcode
///////////////////////////////////////////////////////////////////////////////////////////////////////

#Область ОбработчикиСобытийФормы

&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	
	ОсновнойОбъектАдресации = Параметры.ОсновнойОбъектАдресации;
	ОбновитьДанныеЭлементов();
	
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	
	Если ИмяСобытия = "Запись_РолеваяАдресация" Тогда
		ОбновитьДанныеЭлементов();
	КонецЕсли;
	
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиСобытийЭлементовТаблицыФормыСписок

&НаКлиенте
Процедура СписокВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
	НазначитьИсполнителей(Неопределено);
	СтандартнаяОбработка = Ложь;
КонецПроцедуры

&НаКлиенте
Процедура СписокПередНачаломИзменения(Элемент, Отказ)
	НазначитьИсполнителей(Неопределено);
	Отказ = Истина;
КонецПроцедуры

#КонецОбласти

#Область ОбработчикиКомандФормы

&НаКлиенте
Процедура ВсеНазначенияВыполнить(Команда)
	
	ЗначениеОтбора = Новый Структура("ОсновнойОбъектАдресации", ОсновнойОбъектАдресации);
	ПараметрыФормы = Новый Структура("Отбор", ЗначениеОтбора);
	ОткрытьФорму("РегистрСведений.ИсполнителиЗадач.ФормаСписка", ПараметрыФормы, ЭтотОбъект);
	
КонецПроцедуры

&НаКлиенте
Процедура ОбновитьВыполнить(Команда)
	ОбновитьДанныеЭлементов();
КонецПроцедуры

&НаКлиенте
Процедура НазначитьИсполнителей(Команда)
	
	Назначение = Элементы.Список.ТекущиеДанные;
	Если Назначение = Неопределено Тогда
		ПоказатьПредупреждение(,НСтр("ru = 'Выберите роль в списке.'"));
		Возврат;
	КонецЕсли;
	
	ОткрытьФорму("РегистрСведений.ИсполнителиЗадач.Форма.ИсполнителиРолиСОбъектомАдресации", 
		Новый Структура("ОсновнойОбъектАдресации,Роль", 
			ОсновнойОбъектАдресации, 
			Назначение.РольСсылка));
			
КонецПроцедуры

&НаКлиенте
Процедура СписокРолей(Команда)
	ОткрытьФорму("Справочник.РолиИсполнителей.ФормаСписка",,ЭтотОбъект);
КонецПроцедуры

&НаКлиенте
Процедура ОткрытьСведенияОРоли(Команда)
	
	Если Элементы.Список.ТекущиеДанные = Неопределено Тогда
		Возврат;	
	КонецЕсли;
	
	ПоказатьЗначение(, Элементы.Список.ТекущиеДанные.РольСсылка);
	
КонецПроцедуры

#КонецОбласти

#Область СлужебныеПроцедурыИФункции

&НаСервере
Процедура ОбновитьДанныеЭлементов()
	
	ВыборкаЗапроса = БизнесПроцессыИЗадачиСервер.ВыбратьРолиСКоличествомИсполнителей(ОсновнойОбъектАдресации);
	СписокОбъект = РеквизитФормыВЗначение("Список");
	СписокОбъект.Очистить();
	Пока ВыборкаЗапроса.Следующий() Цикл
		ТипЗначения = ВыборкаЗапроса.ТипыОсновногоОбъектаАдресации.ТипЗначения;
		ВключаетТип = Истина;
		Если ОсновнойОбъектАдресации <> Неопределено Тогда
			ВключаетТип = ТипЗначения <> Неопределено И ТипЗначения.СодержитТип(ТипЗнч(ОсновнойОбъектАдресации));
		КонецЕсли;
		Если ВключаетТип Тогда
			НоваяСтрока = СписокОбъект.Добавить();
			ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаЗапроса, "Исполнители,Роль,РольСсылка,ВнешняяРоль"); 
		КонецЕсли;
	КонецЦикла;
	СписокОбъект.Сортировать("Роль");
	Для каждого СтрокаСписка Из СписокОбъект Цикл
		Если СтрокаСписка.Исполнители = 0 Тогда
			СтрокаСписка.ИсполнителиСтрока = ?(СтрокаСписка.ВнешняяРоль, НСтр("ru = 'заданы в другой программе'"), НСтр("ru = 'не заданы'"));
			СтрокаСписка.Картинка = ?(СтрокаСписка.ВнешняяРоль, -1, 1);
		ИначеЕсли СтрокаСписка.Исполнители = 1 Тогда
			СтрокаСписка.ИсполнителиСтрока = Строка(БизнесПроцессыИЗадачиСервер.ВыбратьИсполнителя(ОсновнойОбъектАдресации, СтрокаСписка.РольСсылка));
			СтрокаСписка.Картинка = -1;
		Иначе
			СтрокаСписка.ИсполнителиСтрока = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 чел'"), Строка(СтрокаСписка.Исполнители) );
			СтрокаСписка.Картинка = -1;
		КонецЕсли;
	КонецЦикла;
	ЗначениеВРеквизитФормы(СписокОбъект, "Список");
	
КонецПроцедуры

#КонецОбласти
